package designerMode.template;

/**
 * ktvroom
 *
 *  openDevice();
 *  pay();
 *  这两个在每个KTV都是相同的逻辑，所以抽象类自己实现，也就是说相同逻辑的可以用模版方法写在抽象类里面
 *  orderSong();
 *  点歌每个人点的都不同交给子类去实现
 *  orderExtra();
 *  可能会点其他的东西，相当于钩子函数，可以点也可以不点 点了我就执行 不点拉倒我执行了一个空函数
 * @author liuchaoqun
 * @date 2022/11/15
 */
public abstract class KTVRoom {

    public void procedure(){
        openDevice();
        orderSong();
        orderExtra();
        pay();
    }

    private void pay() {
        System.out.println("付款成功");
    }

    /**
     * 相当于钩子函数，因为有可能没有额外的开销，实现或者不实现都可以
     */
    protected void orderExtra() {
    }

    /**
     * 必须又子类去实现方便扩展 protect表示只有本类或者子类能够访问到
     */
    protected abstract void orderSong();

    private void openDevice() {
        System.out.println("启动设备");
    }
    
}
